#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>


// test library calls
//int main()
//{
//    // Text operation(文本操作)
//    //FILE* pf = fopen("test.txt", "w");
//    //if(pf == NULL)
//    //{
//    //    perror("fopen");
//    //    return 1;
//    //}
//    //int ch;
//    //while((ch = fgetc(stdin)) != EOF)
//    //{
//    //    fputc(ch, pf);
//    //}
//    //fclose(pf);
//    
//    //FILE* pf = fopen("test.txt", "r");
//    //if(pf == NULL)
//    //{
//    //    perror("fopen");
//    //    return 1;
//    //}
//    //char buf[3];
//    //while(fgets(buf, sizeof(buf), pf))
//    //{
//    //    fputs(buf, stdout);//这里不用手动加'\0'，fgets自动加了
//    //}
//    //if(feof(pf))
//    //{
//    //    puts("End of file reached successfully");
//    //}
//    //else if(ferror(pf))
//    //{
//    //    puts("I/O error when reading");
//    //}
//    //fclose(pf);
//    
//    //FILE* pf = fopen("test.txt", "a");
//    //if(pf == NULL)
//    //{
//    //    perror("fopen");
//    //    return 1;
//    //}
//    //char buf[128] = {'\0'};
//    //fscanf(stdin, "%s", buf);
//    //fprintf(pf, "%s\n", buf);
//    //fclose(pf);
//    
//    //FILE* pf = fopen("test.txt", "r");
//    //if(pf == NULL)
//    //{
//    //    perror("fopen");
//    //    return 1;
//    //}
//    //char buf[128];
//    //int n;
//    //while(n = fread(buf, 1, 127, pf))
//    //{
//    //    buf[n] = 0;
//    //    fwrite(buf, strlen(buf) -1, 1,  stdout);
//    //}
//    //fclose(pf);
//
//    // binary operation(二进制操作)
//
//    //FILE* pf = fopen("test.txt", "rb");
//    //if(pf == NULL)
//    //{
//    //    perror("fopen");
//    //    return 1;
//    //}
//    //char buf[128];
//    //int n;
//    //while(n = fread(buf, 1, 127, pf))
//    //{
//    //    buf[n] = 0;
//    //    fwrite(buf, strlen(buf) -1, 1,  stdout);
//    //}
//    //fclose(pf);
//    
//    //FILE* pf = fopen("test1.txt", "wb+");
//    //if(pf == NULL)
//    //{
//    //    perror("fopen");
//    //    return 1;
//    //}
//    //int a = 13;
//    //fwrite(&a, sizeof(a), 1, pf);
//    //rewind(pf);//文件指针归位
//    //int b;
//    //size_t n = fread(&b, sizeof(b), 1, pf);
//    //if(n == 1)
//    //{
//    //    printf("%d\n", b);
//    //}
//    //else 
//    //{
//    //    printf("读取失败\n");
//    //}
//    //fclose(pf);
//    return 0;
//}

// test system calls
//int main()
//{
//    //int fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    //const char* mag = "hello dudu\n";
//    //int cnt = 5;
//    //while(cnt--)
//    //{
//    //    write(fd, mag, strlen(mag));
//    //}
//    //close(fd);
//    
//    //int fd = open("test.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
//    //const char* mag = "hello dudu\n";
//    //int cnt = 5;
//    //while(cnt--)
//    //{
//    //    write(fd, mag, strlen(mag));
//    //}
//    //close(fd);
//    
//    //umask(0);
//    //int fd = open("test.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
//    //const char* mag = "hello dudu\n";
//    //int cnt = 5;
//    //while(cnt--)
//    //{
//    //    write(fd, mag, strlen(mag));//不要把'\0'写进去
//    //}
//    //close(fd);
//    
//    //int fd = open("test.txt", O_WRONLY | O_TRUNC | O_CREAT, 0666);
//    //if(fd == -1)
//    //{
//    //    perror("open");
//    //    return 1;
//    //}
//    //int data = 123456;
//    ////系统不关心写入方式，随便你用哪种方式写
//    ////文本写入、二进制写入的概念是语言层提供的
//    //write(fd, &data, sizeof(data));
//
//    //char buf[128];
//    //snprintf(buf, sizeof(buf), "%d", data);
//    //write(fd, buf, strlen(buf));//当作字符来写
//    //close(fd);
//    
//    int fd = open("test.txt", O_RDONLY);
//    if(fd == -1)
//    {
//        perror("open");
//        return 1;
//    }
//    int b;
//    read(fd, &b, sizeof(b));
//    printf("%d\n", b);
//    char buf[128];
//    while(1)
//    {
//
//        int n = read(fd, buf, sizeof(buf) - 1);
//        if(n > 0)
//        {
//            buf[n] = 0;
//            printf("%s\n", buf);
//        }
//        else 
//        {
//            break;
//        }
//    }
//    close(fd);
//    return 0;
//}

// 重定向
//int main()
//{
//    int fd = open("test2.txt", O_WRONLY | O_CREAT | O_TRUNC);
//    if(fd == -1)
//    {
//        perror("open");
//        return 1;
//    }
//    dup2(fd, 1);
//    close(fd);
//    printf("%d\n", fd);
//    return 0;
//}

int main(int argc, char* argv[])
{
    if(argc != 2)
        return 1;
    int fd = open(argv[1], O_RDONLY);
    if(fd < 0) return 1;

    dup2(fd, 0);
    close(fd);

    while(1)
    {
        char buffer[64];
        if(!fgets(buffer, sizeof(buffer), stdin))break;

        printf("%s", buffer);
    }
    return 0;
}
